#include <stdio.h>
#include <stdlib.h>
#include "ytlbdl.h"

//1.创建一个空的队列
linkqueue_t *CreateEmptyLinkQueue(){
    linkqueue_t*p=(linkqueue_t*)malloc(sizeof(linkqueue_t));
    if(p == NULL){
        printf("队列头尾分配失败!\n");
        return NULL;
    }
    linkqueue_node_t*phead=(linkqueue_node_t*)malloc(sizeof(linkqueue_node_t));
    if(p == NULL){
        free(p);
        printf("头节点分配失败!\n");
        return NULL;
    }
    phead->data=0;
    phead->next=NULL;
    p->front=p->rear=phead;
    return p;
}

//2.入列 data代表入列的数据
int InLinkQueue(linkqueue_t *p,datatype data){
    if(p == NULL){
        return -1;
    }
    linkqueue_node_t*new=(linkqueue_node_t*)malloc(sizeof(linkqueue_node_t));
    if(new == NULL){
        printf("新节点分配失败\n");
        return -1;
    }
    new->data=data;
    new->next=NULL;
    p->rear->next=new;
    p->rear=new;

}

//3.出列
datatype OutLinkQueue(linkqueue_t *p){
    if(p == NULL){
        return -1;
    }
    if(p->front == p->rear){
        printf("队空!");
        return -1;
    }
    linkqueue_node_t*pdel=(p->front)->next;
    datatype temp=pdel->data;
    p->front->next=pdel->next;
    free(pdel);
    pdel =  NULL;
    if(p->front->next == NULL){
        p->rear=p->front;
    }
    return temp;
}
//4.判断队列是否为空
int IsEmptyLinkQueue(linkqueue_t *p){
    if(p == NULL){
        return -1;
    }
    return p->front != p->rear;
}

//5.求队列长度的函数
int LengthLinkQueue(linkqueue_t *p){
    if(p == NULL){
        return -1;
    }
    int length=0;
    linkqueue_node_t*len=p->front->next;
    while(len!= NULL){
        length++;
        len=len->next;
    }
    return length;
}

//6.清空队列
void ClearLinkQueue(linkqueue_t *p){
    if(p == NULL){
        printf("参数错误!");
        return;
    }
    while(IsEmptyLinkQueue(p)){
        OutLinkQueue(p);
    }
}